import requests  # 导入requests库，用于发送HTTP请求
from parsel import Selector  # 导入parsel库中的Selector类，用于解析HTML文档

class ChapterCrawler:
    """
    ChapterCrawler类用于爬取指定URL的章节链接。
    """

    def __init__(self, bid_url):
        """
        初始化ChapterCrawler类的实例。

        参数:
        bid_url (str): 要爬取的URL地址。
        """
        self.url = bid_url  # 保存传入的URL地址
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        }  # 设置请求头，模拟浏览器访问
        self.text = ""  # 初始化存储网页内容的变量
        self.chapter_url = []  # 初始化存储章节链接的列表

    def get_html(self):
        """
        获取指定URL的HTML内容。
        """
        try:
            resp = requests.get(url=self.url, headers=self.headers)  # 发送GET请求获取网页内容
            self.text = resp.text  # 将网页内容保存到实例变量中
        except:
            pass  # 如果请求失败，则忽略异常

    def parse_html(self):
        """
        解析HTML内容，提取章节链接。
        """
        selector = Selector(text=self.text)  # 使用parsel的Selector解析HTML内容
        result = selector.xpath('//td/a/@href').getall()  # 使用XPath表达式提取所有章节链接
        for r in result:
            self.chapter_url.append('https://ognv.shuqi.com' + r)  # 拼接完整的章节链接并添加到列表中

    def run(self):
        """
        运行爬虫，获取并返回章节链接。

        返回:
        list: 包含所有章节链接的列表。
        """
        self.get_html()  # 调用方法获取HTML内容
        self.parse_html()  # 调用方法解析HTML内容并提取章节链接
        return self.chapter_url  # 返回章节链接列表



if __name__ == '__main__':
    # url = input('输入bid=')
    url = 'https://ognv.shuqi.com/chapter?bid=8867235'
    spider = ChapterCrawler(url)
    chapter_url = spider.run()

